package gestorvideoclub.jdbc;


import gestorvideoclub.Pelicula;
import gestorvideoclub.Producto;
import gestorvideoclub.Tarifa;
import gestorvideoclub.enumeraciones.TipoProductoEnum;
import gestorvideoclub.util.UtilFecha;
import java.util.List;
import java.sql.*;
import java.util.ArrayList;

/**
 *
 * @author JAVA
 */
public class TarifaJDBC{
    public static List<Tarifa> listadoTarifasBBDD(){
        List<Tarifa> lista=new ArrayList();
        String sql = "select * from tarifas";

        Connection con = null;
        try{
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            //guardamos lista de tarifas de la BBDD
            while(rs.next()){
                Tarifa aux = new Tarifa();
                aux.setId(rs.getInt("Id"));
                aux.setNombreTarifa(rs.getString("nombre"));
                aux.setPrecio(rs.getFloat("precio"));
                aux.setFechaInicio(rs.getDate("fechaInicio"));
                aux.setFechaFin(rs.getDate("fechaFin"));
                TipoProductoEnum tipo = TipoProductoEnum.valueOf(rs.getString("tipoProducto"));
                aux.setTipoProducto(tipo);
                lista.add(aux);
            }
            st.close();
            AccesoDatos.cerrarConexion(con);
        }
        catch(Exception e){
            System.out.println("Error al ejecutar consulta "+e.getMessage());
        }
        return lista;
    }

    public static int BuscaIdTarifa(String nombre){
        List<Tarifa> listaT=listadoTarifasBBDD();
        int idT=-1;
        for(Tarifa t: listaT){
            if(t.getNombreTarifa().compareTo(nombre)==0)
            idT=t.getId();
        }
        return idT;
    }

    public static Tarifa consultaTarifaPorId(int idTarifa){
        Tarifa tarifa = new Tarifa();
        String sql = "select * from tarifas where Id = "+idTarifa;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            rs.next();
            tarifa.setId(rs.getInt("Id"));
            tarifa.setNombreTarifa(rs.getString("nombre"));
            tarifa.setTipoProducto(TipoProductoEnum.valueOf(rs.getString("tipoProducto")));
            tarifa.setPrecio(rs.getDouble("precio"));
            String tex = rs.getString("fechaInicio");
            tarifa.setFechaInicio(UtilFecha.obtenerFechaBD(tex));
            tex = rs.getString("fechaFin");
            tarifa.setFechaFin(UtilFecha.obtenerFechaBD(tex));
        }
        catch(Exception e){
            System.out.println("Error al obtener la tarifa ");
        }
        return tarifa;
    }
    
/*
 * @author Cristina
 */
    public static ArrayList obtenerTarifaProducto(Producto producto, Date fecha){
        ArrayList<Tarifa> listaTarifa = new ArrayList<Tarifa>();
        String sql = "select * from tarifas where fechaInicio <= '"+UtilFecha.fechaMySQL(fecha)+"'";
        sql +=" and fechaFin >= '"+UtilFecha.fechaMySQL(fecha)+"'or fechaFin ='1970-01-01'  and tipoProducto ='"+producto.getTipo();
        
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){
                Tarifa tarifa = new Tarifa();
                tarifa.setId(rs.getInt("Id"));
                tarifa.setNombreTarifa(rs.getString("nombre"));
                tarifa.setTipoProducto(TipoProductoEnum.valueOf(rs.getString("tipoProducto")));
                tarifa.setPrecio(rs.getFloat("precio"));
                String tex = rs.getString("fechaInicio");
                tarifa.setFechaInicio(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaFin");
                tarifa.setFechaFin(UtilFecha.obtenerFechaBD(tex));
                listaTarifa.add(tarifa);
            }
        }
        catch(Exception e){
            System.out.println("Error al obtener las tarifas "+e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaTarifa;
    }
    /*
     * metodo que se utiliza pra comprobar si la tarifa de un producto está caducada
     * 
     * @author Rafa
     * @param dev       devuelve true si la fecha de la tarifa que tiene un producto ha caducado
     * 
     */
    public static boolean compruebaCaducidadTarifa(Producto p){
        boolean dev=false;
        long fechaActualSistema = System.currentTimeMillis();//guardamos fechaActual de sistema para comparar fechas de tipo long
        Tarifa t = TarifaJDBC.consultaTarifaPorId(p.getTarifa().getId());
        if(t.getFechaFin().getTime()<fechaActualSistema)
            dev=true;
        else
            dev=false;
        return dev;
    }
    /* 
     * @author Rafa
     */
    public static int devuelveIdTarifaPorDefectoDVD(){
         int id = TarifaJDBC.BuscaIdTarifa("pordefectoDVD");
         return id;
     }
    /*
     * @author Rafa
     */
     public static int devuelveIdTarifaPorDefectoBLUERAY(){
         int id = TarifaJDBC.BuscaIdTarifa("pordefectoBLUERAY");
         return id;
     }
    /*
     * @author Rafa
     */
     public static int devuelveIdTarifaPorDefectoVIDEOJUEGO(){
         int id = TarifaJDBC.BuscaIdTarifa("pordefectoVIDEOJUEGO");
         return id;    
     }
     /*
      * Metodo usado para devolver la tarifa Por defecto, segun sea el Tipo del Producto
      * 
      * @author Rafa
      */
    public static Tarifa DevuelveTarifaPorDefecto(TipoProductoEnum tipo){
       int idT=0;
       Tarifa t= new Tarifa();
       if(tipo.toString().compareToIgnoreCase("DVD")==0)
        {
            idT = TarifaJDBC.devuelveIdTarifaPorDefectoDVD();
            t = TarifaJDBC.consultaTarifaPorId(idT);
        }
       else if(tipo.toString().compareToIgnoreCase("BlueRay")==0)
            {
                idT = TarifaJDBC.devuelveIdTarifaPorDefectoBLUERAY();
                t = TarifaJDBC.consultaTarifaPorId(idT);
            }
            else
            {
                idT = TarifaJDBC.devuelveIdTarifaPorDefectoVIDEOJUEGO();
                t = TarifaJDBC.consultaTarifaPorId(idT);
            }
       return t;
    }     
    
 /**
      * Devuelve listado de Tarifas
      * 
      */
     public static List<Tarifa> consultaTarifas(){
        String sql = "select * from tarifas";
        List<Tarifa> lista = new ArrayList();
        int IdTar;
        String nombreTar;
        Date fechaIniTar,fechaFinTar;
        Float precioTar;
        TipoProductoEnum tipoProdTar;
        Tarifa tarifa=null;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                IdTar = rs.getInt("tarifas.Id");
                nombreTar = rs.getString("tarifas.nombre");
                tipoProdTar = TipoProductoEnum.valueOf(rs.getString("tarifas.tipoProducto"));
                precioTar = rs.getFloat("tarifas.precio");
                fechaFinTar = rs.getDate("tarifas.fechaFin");
                fechaIniTar = rs.getDate("tarifas.fechaInicio");
                tarifa = new Tarifa(IdTar,nombreTar, tipoProdTar, precioTar, fechaIniTar, fechaFinTar);
                lista.add(tarifa);
            }
        } catch (Exception e) {
            System.out.println("Error a obtener la Tarifa " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
     }
         
   public static void insertaTarifa(Tarifa v) {
        String fechaSQL = UtilFecha.fechaMySQL(v.getFechaFin());
        String fechaSQL2 = UtilFecha.fechaMySQL(v.getFechaInicio());    
        String sql = "insert into tarifas (Id,nombre, tipoProducto,precio,fechaInicio, fechaFin, tituloProducto) values (" + v.getId() + ", '" + v.getNombreTarifa();
        sql += "', '" + v.getTipoProducto().toString() + "', "+v.getPrecio()+",'" + fechaSQL2 + "', '" + fechaSQL+"', '"+null+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al insertar Tarifa " + e.getMessage());
        }
    }     
    /**
     * metodo para sobreecribir tarifa
     * 
     * @param t         Tarifa a sobreescribir
     */
    public static void sobreescribeTarifa(Tarifa t){
        String fechaSQL = UtilFecha.fechaMySQL(t.getFechaFin());
        String fechaSQL2 = UtilFecha.fechaMySQL(t.getFechaInicio()); 
        String sql = "UPDATE tarifas set tarifas.nombre= '"+t.getNombreTarifa()+"' ,tarifas.tipoProducto='"+t.getTipoProducto().toString();
        sql += "',tarifas.precio= " + t.getPrecio() + " ,tarifas.fechaInicio = '" + fechaSQL2 + "' ,tarifas.fechaFin= '" +fechaSQL+"' ,tarifas.tituloProducto='"+null+"' where tarifas.Id=" + t.getId();
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al modificar Tarifa " + e.getMessage());
        }
    }
    /*
     * modificamos fecha final de la tarifa, poniendola inferrior a la del sistema
     * (para que no este activa)
     * 
     */
    public static void bajaTarifa(Tarifa t){
       long fechaSistema = System.currentTimeMillis()-10000;//pongo fecha inferior a fecha actual del sistema en alta producto, asi no la muestra
       t.getFechaFin().setTime(fechaSistema);
       String fechaSQL = UtilFecha.fechaMySQL(t.getFechaFin());
       String sql = "UPDATE tarifas set tarifas.fechaFin= '" +fechaSQL+"' where tarifas.Id=" + t.getId();
       Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al dar de baja Tarifa " + e.getMessage());
        }
    }
        
}

